﻿using SAIM.Models.DAL;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace SAIM.Models.BLL
{
    public class ApplicationsBLL : IDisposable
    {
        private SAIMEntities db;
        private List<ApplicationsDAL> _value;

        /// <summary>
        /// Contiene la información de todas la solicitudes de inmuebles
        /// </summary>
        public List<ApplicationsDAL> Value 
        {
            get { return (_value = _value ?? db.Applications.ToList()); }
            set { _value = value; }
        }
    
        /// <summary>
        /// Devuelve una solicitud de inmueble mediante ID de usuario, ID de inmueble y fecha de reservación  
        /// </summary>
        /// <param name="userId">Id de usuario</param>
        /// <param name="immovableId">Id de inmueble</param>
        /// <param name="reservationDate">Fecha de solicitud de inmueble</param>
        /// <returns></returns>
        public ApplicationsDAL getApplication(string userId, long immovableId, DateTime reservationDate)
        {
            return Value.FirstOrDefault(a => (a.UserId == userId) && (a.ImmovableId == immovableId) && (a.ReservationDate == reservationDate));
        }

        /// <summary>
        /// Devuelve una solicitud de inmueble
        /// </summary>
        /// <param name="Id">ID de solicitud de inmueble</param>
        /// <returns></returns>
        public ApplicationsDAL getApplication(long Id)
        {
            return Value.FirstOrDefault(a => a.Id == Id);
        }

        /// <summary>
        /// Devuelve una aplicación mediante ID de solicitud e ID de usuario
        /// </summary>
        /// <param name="Id">ID de solicitud de inmueble</param>
        /// <param name="UserId">ID de usuario</param>
        /// <returns></returns>
        public ApplicationsDAL getApplication(long Id, string UserId)
        {
            return Value.FirstOrDefault(a => (a.Id == Id) && (a.UserId == UserId));
        }

        public ApplicationsBLL()
        {
            db = new SAIMEntities();
        }

        /// <summary>
        /// Inserta una nueva solicitud de inmueble en la base de datos
        /// </summary>
        /// <param name="_UserId">ID de usuario</param>
        /// <param name="_ImmovableId">ID de inmueble</param>
        /// <param name="_ReservationDate">Fecha de reservación</param>
        /// <param name="_Observations">Observaciones</param>
        /// <returns></returns>
        public bool insertApplication(string _UserId, long _ImmovableId, DateTime _ReservationDate, string _Observations)
        {
            ApplicationsDAL application = new ApplicationsDAL()
            {
                UserId = _UserId,
                ImmovableId = _ImmovableId,
                ReservationDate = _ReservationDate,
                observations = _Observations
            };
            try
            {
                db.Applications.Add(application);
                db.SaveChanges();
            }
            catch (Exception) { return false; }
            return true;
        }

        /// <summary>
        /// Devuelve todas las solicitudes de inmueble de un usuario
        /// </summary>
        /// <param name="userId">ID de usuario</param>
        /// <returns></returns>
        public List<ApplicationsDAL> getUserApplications(string userId)
        {
            return Value.FindAll(a => a.UserId == userId);
        }

        /// <summary>
        /// Elimina una solicitud de inmueble
        /// </summary>
        /// <param name="applicationId">ID de solicitud de inmueble</param>
        /// <returns></returns>
        public bool deleteApplication(long applicationId)
        {
            ApplicationsDAL application = Value.FirstOrDefault(a => a.Id == applicationId);
            try
            {
                db.Applications.Remove(application);
                db.SaveChanges();
            }
            catch (Exception) { return false; }
            return true;
        }

        /// <summary>
        /// Devuelve todas las solicitudes de inmueble existentes en la base de datos
        /// </summary>
        /// <returns></returns>
        public List<ApplicationsDAL> getAllApplications()
        {
            return Value.OrderBy(a => a.ReservationDate).ToList();
        }

        public void Dispose()
        {
            db.Dispose();
        }
    }
}